﻿
#pragma once
#include "types.h"
#include <string.h> 
struct SBuf
{
	char* _base = nullptr;				//缓冲区起始指针
	char* _b = nullptr;					//数据起始指针
	char* _e = nullptr;					//数据末端指针
	size_t _size = 0;					//缓冲区大小

	SBuf(size_t size);					
	SBuf();
	~SBuf();
	/**
	 * @brief 获取数据起始指针 
	 * @param 无	 
	 * @return 返回数据起始指针
	 * @note 注意
	 * @see  data()
	 */
	char* data(){ return _b; }

	/**
	 * @brief 追加数据 
	 * @param char* b		数据起始指针	
	 * @param int32_t l		数据长度
	 * @return 无
	 * @note 注意
	 * @see  
	 */
	void append(char* b, int32_t l);

	/**
	 * @brief 消耗数据。
	 * @param int32_t l 消耗数据的长度
	 * @param 形参 参数说明
	 * @return 无
	 * @note 注意
	 * @see  
	 */
	void consume(int32_t l);
	/**
	 * @brief 清空数据	 
	 * @param 无
	 * @return 无
	 * @note 注意
	 * @see  
	 */
	void clear(){ _b = _e = _base; }
	/**
	 * @brief 数据长度 	 
	 * @param 无
	 * @return 返回数据的长度
	 * @note 注意
	 * @see  
	 */
	int64_t len()
	{ 
		if (_e<_b){
			return 0;
		}
		return _e-_b;
	}

	/**
	 * @brief 运算符重载。赋值时，使用深拷贝。
	 * @param SBuf rBuf  运算对象	 
	 * @return 无
	 * @note 注意
	 * @see  
	 */
	SBuf* operator =(SBuf rBuf)
	{
		if (&rBuf != this)
		{
			this->_b = this->_e = this->_base;
			memcpy(this->_b, rBuf._b, rBuf.len());
			this->_e += rBuf.len();
		}
		return this;
	}
	SBuf(const SBuf& rBuf)
	{
		if (&rBuf != this)
		{			
			int bLen = rBuf._e - rBuf._b;
			_b = _e = _base = new char[bLen];
			memcpy(this->_b, rBuf._b, bLen);
			this->_e += bLen;
		}
	}
};
